<?php

require_once "ptempl.php";

class Datos2 {

  private $numeros;
  private $factores;
  private $cantidadFactores;
  private $cantidadNumeros;
  private $actual;
  
  public function generar () {
    $this -> cantidadFactores = rand(4, 12);
    $this -> factores = array();
    $factorInicial = 1;
    for ($p = 0; $p < $this -> cantidadFactores; $p ++)
      $this -> factores[$p] = $factorInicial += rand(1, 6);
    $this -> cantidadNumeros = rand(6, 20);
    $this -> numeros = array();
    for ($p = 0; $p < $this -> cantidadNumeros; $p ++)
      $this -> numeros[$p] = rand(1000, 9999);
    sort($this -> numeros, SORT_NUMERIC);
    $this -> actual = 0;
  }
  
  public function filas () {
    return (int) $this -> cantidadNumeros;
  }
  
  public function siguiente () {
    $resultado = array(0 => (int) ($this -> cantidadFactores + 1));
    $numero = $this -> numeros[$this -> actual ++];
    $resultado[1] = array(1 => (string) $numero);
    for ($p = 0; $p < $this -> cantidadFactores; $p ++)
      $resultado[$p + 2] = array(1 => (string) ($numero * $this -> factores[$p]));
    return $resultado;
  }
  
  public function encabezado () {
    $resultado = array(0 => $this -> cantidadFactores);
    for ($p = 0; $p < $this -> cantidadFactores; $p ++)
      $resultado[$p + 1] = array(1 => (string) $this -> factores[$p]);
    return $resultado;
  }

}

function esMultiplo ($numero, $m1, $m2) {
  $r = 0;
  if (!($numero % $m1)) $r ++;
  if (!($numero % $m2)) $r += 2;
  return $r;
}

function elementos ($filas, $columnas, $numeros, $m1, $m2) {
  global $filaActual;
  $f = $filaActual ++;
  $resultado = array(0 => $columnas);
  for ($p = 0; $p < $columnas; $p ++) {
    $num = $numeros[$f][$p];
    $mul = esMultiplo($num, $m1, $m2);
    if ($mul == 0) $estilo = 'normal'; else $estilo = 'm' . ((string) $mul);
    $resultado[$p + 1] = array('numero' => (string) $num, 'estilo' => $estilo);
  }
  return $resultado;
}

function esPrimo ($numeros) {
  global $pActual;
  $numero = $numeros[$pActual ++];
  if ($numero == 2) return true;
  if (($numero % 2) == 0) return false;
  for ($x = 3; ($x * $x) <= $numero; $x += 2)
    if (($numero % $x) == 0) return false;
  return true;
}

function generarTodo ($etiqueta, $contenido) {
  switch ($etiqueta) {
    case 'titulo': return array(1 => "Pagina de prueba -- codigo " . sprintf("%05d", rand(0, 99999)));
    case 'elemento':
      $res = array(0 => 0);
      foreach ($contenido as $elemento)
        $res[++ $res[0]] = array(1 => $elemento);
      return $res;
    case 'separacion': return rand(2, 5);
    case 'color':
      $colores = array('#000000', '#008000', '#222222');
      $color = $colores[rand(0, 2)];
      return array(
        'fondo' => "rgb(" . rand(240, 255) . ", " . rand(240, 255) . ", " . rand(240, 255) . ")",
        'texto' => $color
      );
    default: return null;
  }
}

$datos2 = new Datos2();
$datos2 -> generar();

$m = array(4, 5, 6, 7, 9, 11);
shuffle($m);
$m1 = $m[0];
$m2 = $m[1];
$filas = rand(6, 12);
$columnas = rand(5, 9);
$numeros = array();
$filaActual = 0;
for ($i = 0; $i < $filas; $i ++)
  for ($j = 0; $j < $columnas; $j ++)
    $numeros[$i][$j] = rand(100, 999);

$verifPrimos = array();
$cantPrimos = rand(40, 80);
for ($p = 0; $p < $cantPrimos; $p ++)
  $verifPrimos[$p] = rand(2, 9999);
sort($verifPrimos);
$pActual = 0;

$t1 = file_get_contents("tabla1.htm");
$t2 = file_get_contents("tabla2.htm");
$t3 = file_get_contents("tabla3.htm");

$resultado = file_get_contents("general.htm");

$t1 = parse_template($t1, array(
        'titulo' => function ($f, $c, $n, $m1, $m2) {return "Multiplos de $m1 y $m2";},
        'fila' => function ($f) {return $f;},
        'elemento' => 'elementos',
        'pie' => function ($f, $c) {return array(1 => (string) ($f * $c));},
        'leyenda' => function ($f, $c, $n, $m1, $m2) {
          return array (
            0 => 3,
            1 => array(
              1 => (string) $m1,
              2 => 'm1'
            ),
            2 => array(
              1 => (string) $m2,
              2 => 'm2'
            ),
            3 => array(
              1 => (string) ($m1 * $m2),
              2 => 'm3'
            )
          );
        }
      ), $filas, $columnas, $numeros, $m1, $m2);

$t2 = parse_template($t2, array(
    'factor' => array($datos2, 'encabezado'),
    'fila' => array($datos2, 'filas'),
    'elemento' => array($datos2, 'siguiente')
  ));
  
$t3 = parse_template($t3, array(
    'fila' => function ($n, $cant) {
      $resultado = array(0 => $cant);
      for ($p = 0; $p < $cant; $p ++)
        $resultado[$p + 1] = array(1 => (string) $n[$p]);
      return $resultado;
    },
    'primo' => 'esPrimo'
  ), $verifPrimos, $cantPrimos);
  
$mostrar = array($t1, $t2, $t3);
shuffle($mostrar);

$resultado = parse_template($resultado, 'generarTodo', $mostrar);

$coloresEspeciales = array('#ff0000', '#0000ff', '#8000ff', '#ff8000');
$grosor = array('400', '700');

$estilos = array();
$pos = 0;
foreach($coloresEspeciales as $color)
  foreach($grosor as $g)
    $estilos[$pos ++] = array($color, $g);
$seleccion = array_rand($estilos, 3);
$est = array();
foreach ($seleccion as $k => $n)
  $est[$k] = $estilos[$n];

$resultado = parse_template($resultado, array('estilo' => function ($e) {
    $res = array(0 => 3);
    for ($p = 0; $p < 3; $p ++)
      $res[$p + 1] = array(
        1 => 'm' . ((string) ($p + 1)),
        2 => $e[$p][1],
        3 => $e[$p][0]
      );
    return $res;
  }), $est);

echo $resultado;

?>